From 6f538950d41e2b97437afccde613d15fb931b712 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Thu, 4 Sep 2014 13:23:26 +0200 Subject: [PATCH] dnd: Make the drag gesture obey the button mask specified This was forgotten when making DnD use a GtkGesture in the handlers attached to the widget in gtk_drag_source_set(). The gesture must obey the specified button mask, and switch to denied state if the pressed button isn't part of the given mask. https://bugzilla.gnome.org/show_bug.cgi?id=735965 --- gtk/gtkdnd.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c index 6fabf68420..8a100fdc17 100644 --- a/gtk/gtkdnd.c +++ b/gtk/gtkdnd.c @@ -250,6 +250,9 @@ static void gtk_drag_cancel (GtkDragSourceInfo *info, GtkDragResult result, guint32 time); +static void gtk_drag_source_gesture_begin (GtkGesture *gesture, + GdkEventSequence *sequence, + gpointer data); static gboolean gtk_drag_source_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data); @@ -2783,6 +2786,9 @@ gtk_drag_source_set (GtkWidget *widget, gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (site->drag_gesture), GTK_PHASE_NONE); gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (site->drag_gesture), 0); + g_signal_connect (site->drag_gesture, "begin", + G_CALLBACK (gtk_drag_source_gesture_begin), + site); g_signal_connect (widget, "button-press-event", G_CALLBACK (gtk_drag_source_event_cb), @@ -3867,6 +3873,23 @@ gtk_drag_drop (GtkDragSourceInfo *info, /* * Source side callbacks. */ +static void +gtk_drag_source_gesture_begin (GtkGesture *gesture, + GdkEventSequence *sequence, + gpointer data) +{ + GtkDragSourceSite *site = data; + guint button; + + if (gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture))) + button = 1; + else + button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)); + + if (!site->start_button_mask || + !(site->start_button_mask & (GDK_BUTTON1_MASK << (button - 1)))) + gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_DENIED); +} static gboolean gtk_drag_source_event_cb (GtkWidget *widget, -- 2.30.2